home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Freeware 2002 November
/
SGI Freeware 2002 November - Disc 1.iso
/
dist
/
fw_curl.idb
/
usr
/
freeware
/
catman
/
p_man
/
cat3
/
libcurl-multi.Z
/
libcurl-multi
Wrap
Text File
|
2002-07-08
|
5KB
|
106 lines
libcurl-multi(5) libcurl multi interface libcurl-multi(5)
NNAAMMEE
libcurl-multi - how to use the multi interface
DDEESSCCRRIIPPTTIIOONN
This is an overview on how to use the libcurl multi inter
face in your C programs. There are specific man pages for
each function mentioned in here. There's also the libcurl-
the-guide document for a complete tutorial to programming
with libcurl and the _l_i_b_c_u_r_l_(_3_) man page for an overview
of the libcurl easy interface.
All functions in the multi interface are prefixed with
curl_multi.
PPLLEEAASSEE NNOOTTIICCEE
The multi interface is a rather new member of the libcurl
family. It has not yet been very widely used. It may still
be a few more bugs lurking in there than we are used to.
That said, it might also just work in every aspect you try
it. Please report all bugs and oddities you see.
OOBBJJEECCTTIIVVEESS
The multi interface introduces several new abilities that
the easy interface refuses to offer. They are mainly:
1. Enable a "pull" interface. The application that uses
libcurl decides where and when to ask libcurl to get/send
data.
2. Enable multiple simultaneous transfers in the same
thread without making it complicated for the application.
3. Enable the application to select() on its own file
descriptors and curl's file descriptors simultaneous eas
ily.
OONNEE MMUULLTTII HHAANNDDLLEE MMAANNYY EEAASSYY HHAANNDDLLEESS
To use the multi interface, you must first create a 'multi
handle' with _c_u_r_l___m_u_l_t_i___i_n_i_t. This handle is then used as
input to all further curl_multi_* functions.
Each single transfer is built up with an easy handle. You
must create them, and setup the appropriate options for
each easy handle, as outlined in the _l_i_b_c_u_r_l_(_3_) man page.
When the easy handle is setup for a transfer, then instead
of using _c_u_r_l___e_a_s_y___p_e_r_f_o_r_m (as when using the easy inter
face for transfers), you should instead add the easy han
dle to the multi handle using _c_u_r_l___e_a_s_y___a_d_d___h_a_n_d_l. The
multi handle is sometimes referred to as a multi stack
because of the fact that it may hold a large amount of
easy handles.
Should you change your mind, the easy handle is again
removed from the multi stack using _c_u_r_l___m_u_l_t_i___r_e_m_o_v_e___h_a_n_
_d_l_e. Once removed from the multi handle, you can again use
other easy interface functions like curl_easy_perform or
whatever you think is necessary.
Adding the easy handles to the multi handle does not start
any transfer. Remember that one of the main ideas with
this interface is to let your application drive. You drive
the transfers by invoking _c_u_r_l___m_u_l_t_i___p_e_r_f_o_r_m. libcurl will
then transfer data if there is anything available to
transfer. It'll use the callbacks and everything else you
have setup in the individual easy handles. It'll transfer
data on all current transfers in the multi stack that are
ready to transfer anything. It may be all, it may be none.
Your application can acquire knowledge from libcurl when
it would like to get invoked to transfer data, so that you
don't have to busy-loop and call that _c_u_r_l___m_u_l_t_i___p_e_r_f_o_r_m
like a mad man! _c_u_r_l___m_u_l_t_i___f_d_s_e_t offers an interface using
which you can extract fd_sets from libcurl to use in
select() or poll() calls in order to get to know when the
transfers in the multi stack might need attention. This
also makes it very easy for your program to wait for input
on your own private file descriptors at the same time or
perhaps timeout every now and then, should you want that.
_c_u_r_l___m_u_l_t_i___p_e_r_f_o_r_m stores the number of still running
transfers in one of its input arguments, and by reading
that you can figure out when all the transfers in the
multi handles are done. 'done' does not mean successful.
One or more of the transfers may have failed.
To get information about completed transfers, to figure
out success or not and similar, _c_u_r_l___m_u_l_t_i___i_n_f_o___r_e_a_d
should be called. It can return a message about a current
or previous transfer. Repeated invokes of the function get
more messages until the message queue is empty.
When all transfers in the multi stack are done, cleanup
the multi handle with _c_u_r_l___m_u_l_t_i___c_l_e_a_n_u_p. Be careful and
please note that you MMUUSSTT invoke separate
_c_u_r_l___e_a_s_y___c_l_e_a_n_u_p calls on every single easy handle to
clean them up properly.
libcurl 7.9.5 20 March 2001 libcurl-multi(5)